/**
 * 分页库
 * 分页页码从1开始
 * @usage : Pmoo.Pager2.factory('div.pager', 10, 1, options);
 */
 
/*
可选参数options设置
var options = {
	//分页链接模板,其中的{p}会被替换成页码
	urlTpl : 'javascript:void(0);',
	// 中间段显示页码数
	showTo : 5,
	//是否显示最后一页页码
	showLast : true,
	//点击页码的onclick事件返回值,用于控制跳转
	clickReturnValue : false,
	//点击函数页码时触发的函数
	click : function(n){},
	//修饰页码后调用的函数
	afterDecorate : function(n){}
};
*/	

Pmoo.Pager2 = new function(){
	var self = this;
	
	/**
	 * 分页实例
	 */
	var instances = {};
	
	/**
	 * 生成分页实例
	 * 
	 * @param {String} selector 分页容器selector
	 * @param {Int} totalPage 总页数
	 * @param {Int} curentPage 当前页数 
	 * @param {Object} options 可选参数
	 */
	this.factory = function(selector, totalPage, curentPage, options){
		var ins = new this.PagerClass(selector, totalPage, curentPage, options)
		instances[ins.ID] = ins;
		return ins;
	};
	
	/**
	 * 处理由页面产生的页码点击事件
	 * 
	 * @param {String} pid 分页实例的ID
	 * @param {Int} pageno 点击页码
	 */
	this.handle = function(pid, pageno){
		var ins = instances[pid];
		return ins.moveTo(pageno);
	};
}

/**
 * 实例ID自增编号
 */
Pmoo.Pager2._pid = 1;

/**
 * 分页类
 * @param {Sting} selector 分页容器selector
 * @param {Int} totalPage 总页数
 * @param {Int} curentPage 当前页数 
 * @param {Object} options 可选参数
 */
Pmoo.Pager2.PagerClass = function(selector, totalPage, curentPage, options){
	var self = this;

	/**
	 * 当前实例的标识ID
	 */
	this.ID = '__' + (Pmoo.Pager2._pid++) + '__';
	
	/**
	 * 分页容器
	 */
	this.containers = Pmoo.$$(selector);
	
	if( ! this.containers || this.containers.length === 0){
		//没有获取到容器
		return false;
	}
	
	if(totalPage === 0){
		//总页数为0
		this.containers.html('');
		return false;
	}
	
	//参数验证
	totalPage  = (totalPage < 1) ? 1 : totalPage; 
	curentPage = curentPage.limit(1, totalPage);	
		 
	/**
	 * 默认参数
	 */
	var settings = {
		/**
		 * 分页链接模板,其中的{p}会被替换成页码
		 */
		urlTpl : 'javascript:void(0);',
		/**
		 * 当前页样式名称
		 */
		activeClass : 'active',
		/**
		 * 不可点页样式名称
		 */
		disableClass : 'disable',		
		/**
		 * 中间段显示页码数
		 */
		showTo : 7,
		/**
		 * 是否显示最后一页页码
		 */
		showLast : true,
		/**
		 * 点击页码的onclick事件返回值,用于控制跳转
		 */
		clickReturnValue : false,
		/**
		 * 点击函数页码时触发的函数
		 */
		click : function(n){},
		/**
		 * 修饰页码后调用的函数
		 */
		afterDecorate : function(n){}
	};
	
	$extend(settings, options);
	
	/**
	 * 初始函数
	 */
	function __init__(pageno){
		pageno = pageno.limit(1, totalPage);
		curentPage = pageno;
		var html = createHtml();
		self.containers.html(html);
		//触发afterDecorate事件
		try{
			settings.afterDecorate(pageno);
		}
		catch(e){}				
	}
	
	/**
	 * 移动到指定页码
	 * 
	 * @param {Int} pageno 页码
	 */
	this.moveTo = function(pageno){
		pageno = pageno.limit(1, totalPage);
		if(pageno == curentPage){
			//点击当前页,不作处理
			return false;
		}
		curentPage = pageno;
		var html = createHtml();
		this.containers.html(html);
		//触发afterDecorate事件
		try{
			settings.afterDecorate(pageno);
		}
		catch(e){}
		//触发click事件
		try{
			settings.click(pageno);
		}
		catch(e){}
		//decorateHtml();
		return settings.clickReturnValue;		
	};
	
	/**
	 * 生成分页html
	 */
	function createHtml(){
		/**
		 * 生成页码链接
		 * 
		 * @param {Int} n 页码
		 * @param {String} 页码文字
		 * @param {Boolean} dis 使用disableClass样式
		 */
		function renderUrl(n, text, dis){
			var ret = '';
			if(n == curentPage){
				//当前页的样式与链接
				lclass = dis ? settings.disableClass : settings.activeClass;
				link = 'javascript:void(0);';
			}
			else{
				lclass = '';
				link = settings.urlTpl.replace(/\{p\}/,n);
			}
			ret = [
				'<li><a href="',
				link,
				'" class="',
				(lclass ? lclass : ''),
				'" onclick="return Pmoo.Pager2.handle(\'',
				self.ID,'\',',n,
				,')">',
				(text ? text : n),
				'</a></li>'
			].join('');
			return ret;
		}
		
		/**
		 * 添加第一个省略号
		 */
		function addFirSup(){
			if(totalPage <= (settings.showTo + 1) || 
				curentPage <= (Math.ceil(settings.showTo / 2) + 1)){
				return '';
			}
			return '<li class="ellipsis">...</li>';
		}
		
		/**
		 * 添加第二个省略号
		 */
		function addSecSup(){
			if(totalPage <= (settings.showTo + 1) ||
				curentPage > (totalPage - Math.ceil(settings.showTo / 2) - 1)){
				return '';
			}
			return '<li class="ellipsis">...</li>';			
		}
		
		/**
		 * 最后一页页码,用于判断是否显示最后一页
		 */
		function renderLast(){
			if( ! settings.showLast &&
				//当省略号隐藏的时候显示最后一页 
				curentPage <= (totalPage - Math.ceil(settings.showTo / 2) - 1)){
				return '';
			}
			else{
				return renderUrl(totalPage);
			}
		}
		
		//计算上下页页码
		var pre  = curentPage - 1;
		pre      = (pre > 0) ? pre : 1;
		var next = curentPage + 1;
		next     = (next > totalPage) ? totalPage : next;
		//上下页的html
		var prePageHtml  = renderUrl(pre, '上一页', true);
		var nextPageHtml = renderUrl(next, '下一页', true);
		//中间部分页面的html
		var codePageHtml = [];
		//计算页码片段的开始和结束页码
		var begin,end;
		if(totalPage <= (settings.showTo + 1)){
			begin = 1;
			end = totalPage;
			}
		else{
			//以curpage + setting.showto/2 为中心
			begin = curentPage - Math.floor(settings.showTo/2);
			begin = begin < 1 ? 1 : begin;
			begin = totalPage - curentPage < Math.floor(settings.showTo/2) ? 
				(totalPage - settings.showTo + 1): begin;
			end = begin + settings.showTo - 1;
			end = end >totalPage ? totalPage : end;			
			}
		if(begin != 1){
			//确保第一页一定显示	
			codePageHtml.push(renderUrl(1));
			codePageHtml.push(addFirSup());
		}
		for(var i = begin,len = end;i <= len;i++){
			if(i == totalPage){
				//在最后一页之前添加省略号
				codePageHtml.push(addSecSup());
			}
			
			if(i == totalPage){
				//最后一页需要特殊处理
				codePageHtml.push(renderLast());
			}
			else{
				codePageHtml.push(renderUrl(i));	
			}
			
			
			if(i == 1){
				//在第一页之后添加省略号
				codePageHtml.push(addFirSup());	
			}
		}
		if(end != totalPage){
			//确保最后一页一定显示
			codePageHtml.push(addSecSup());
			codePageHtml.push(renderLast());
		}
		codePageHtml = codePageHtml.join('');
		var ret = [
		'<ul>',
			prePageHtml,
			codePageHtml,
			nextPageHtml,
		'</ul>'	
		].join('');
		return ret;		
	}
	
	//this.moveTo(curentPage);
	__init__(curentPage);
};


















